ヘッダーをスキップ
Oracle TimesTen In-Memory Database C開発者およびリファレンス・ガイド
リリース7.0
E05164-03
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

データ・ストアに対する接続および切断

TimesTenデータ・ストアにDSNを作成する方法の詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』を参照してください。作成するDSNのタイプは、アプリケーションがデータ・ストアに直接接続するか、クライアント接続するかによって異なります。

データ・ストアに直接接続する場合は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のUNIXでのDSNの作成またはWindowsでのDSNの作成に関する説明を参照し、DSNを作成します。

データ・ストアにクライアント接続を作成する場合は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のWindowsでのクライアントDSNの作成および設定またはUNIXでのクライアントDSNの作成および設定に関する説明を参照し、DSNを作成します。

データ・ストアに接続するには、ODBC機能のSQLConnectまたはSQLDriverConnectをコールします。データ・ストアから切断するには、ODBC機能のSQLDisconnectをコールします。これらの機能の詳細は、『Microsoft ODBC Programmer's Reference and SDK Guide』を参照してください。

例1.1のコード・フラグメントでは、SQLConnectおよびSQLDisconnectを起動して、FixedDsというデータ・ストアに対する接続および切断を行います。アプリケーションではじめてSQLConnectを起動すると、データ・ストアFixedDsが作成されます。その後SQLConnectを起動すると、既存のデータ・ストアに接続されます。

例1.1

#include <sql.h>

SQLRETURN   retcode;

SQLHDBC     hdbc;

...;

retcode = SQLConnect(hdbc,

                     (SQLCHAR*)"FixedDs", SQL_NTS,

                     (SQLCHAR*)"", SQL_NTS,

                     (SQLCHAR*)"", SQL_NTS);

...;

retcode = SQLDisconnect(hdbc);

...;

例1.2

この例には、データ・ストアを作成し、データ・ストアに対して接続および切断を行う完全なプログラムが含まれています。この例では、SQLConnectではなく、SQLDriverConnectを使用して接続を設定します。また、エラー・メッセージの取得方法についても示します。

#ifdef WIN32

#include <windows.h>

#else

#include <sqlunix.h>

#endif

#include <sql.h>

#include <sqlext.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

static void chkReturnCode(SQLRETURN rc, SQLHENV henv,

                          SQLHDBC hdbc, SQLHSTMT hstmt,

                          char* msg, char *filename,

                          int lineno, BOOL err_is_fatal);

#define DEFAULT_CONNSTR "DSN=RunData;PermSize=32"

int

main(int ac, char** av)

{

  SQLRETURN rc = SQL_SUCCESS;

                  /* General return code for the API */

  SQLHENV henv = SQL_NULL_HENV;

                  /* Environment handle */

  SQLHDBC hdbc = SQL_NULL_HDBC;

                  /* Connection handle */

  SQLHSTMT hstmt = SQL_NULL_HSTMT;

                  /* Statement handle */

  SQLCHAR connOut[255];

                  /* Buffer for completed connection string */

  SQLSMALLINT connOutLen;

                  /* number of bytes returned in ConnOut */

  SQLCHAR *connStr = (SQLCHAR*)DEFAULT_CONNSTR;

                  /* Connection string */

  rc = SQLAllocEnv(&henv);

  if (rc != SQL_SUCCESS) {

fprintf(stderr, "Unable to allocate an "

            "environment handle\n",

   exit(1);

  }

  rc = SQLAllocConnect(henv, &hdbc);

  chkReturnCode(rc, henv, SQL_NULL_HDBC,

                SQL_NULL_HSTMT,

                "Unable to allocate a "

                "connection handle\n",

                __FILE__, __LINE__, 1);

  rc = SQLDriverConnect(hDbc, NULL,

                        connString, SQL_NTS,

                        connOut, sizeof(connOut),

                        &connOutLen,

                        SQL_DRIVER_NOPROMPT);

  chkReturnCode(rc, henv, hdbc, SQL_NULL_HSTMT,

                "Error in connecting to the"

                " data store\n",

                __FILE__, __LINE__, 1);

  rc = SQLAllocStmt(hdbc, &hstmt);

  chkReturnCode(rc, henv, hdbc, SQL_NULL_HSTMT,

                "Unable to allocate a "

                "statement handle\n",

                __FILE__, __LINE__, 1);

  /* Your application code here */

  if (hstmt != SQL_NULL_HSTMT) {

    rc = SQLFreeStmt(hstmt, SQL_DROP);

    chkReturnCode(rc, henv, hdbc, hstmt,

                  "Unable to free the "

                  "statement handle\n",

                  __FILE__, __LINE__, 0);

  }

  rc = SQLDisconnect(hDbc);

  chkReturnCode(rc, henv, hdbc,

                SQL_NULL_HSTMT,

                "Unable to close the "

                "connection\n",

                __FILE__, __LINE__, 0);

  rc = SQLFreeConnect(hDbc);

  chkReturnCode(rc, henv, hdbc,

                SQL_NULL_HSTMT,

                "Unable to free the "

                "connection handle\n",

                __FILE__, __LINE__, 0);

  rc = SQLFreeEnv(henv);

  chkReturnCode(rc, henv, SQL_NULL_HDBC,

                SQL_NULL_HSTMT,

                "Unable to free the "

                "environment handle\n",

                __FILE__, __LINE__, 0);

  return 0;

}

static void

chkReturnCode(SQLRETURN rc, SQLHENV henv,

              SQLHDBC hdbc, SQLHSTMT hstmt,

              char* msg, char *filename,

              int lineno, BOOL err_is_fatal)

{

#define MSG_LNG 512

  SQLCHAR sqlState[MSG_LNG];

  /* SQL state string */

  SQLINTEGER nativeErr;

  /* Native error code */

  SQLCHAR errMsg[MSG_LNG];

  /* Error msg text buffer pointer */

  SQLSMALLINT errMsgLen;

  /* Error msg text Available bytes */

  SQLRETURN ret = SQL_SUCCESS;

  if (rc != SQL_SUCCESS &&

      rc != SQL_NO_DATA_FOUND ) {

    if (rc != SQL_SUCCESS_WITH_INFO) {

      /*

       * It's not just a warning

       */

      fprintf(stderr, "*** ERROR in %s, line %d:"

              " %s\n",

              filename, lineno, msg);

    }

    /*

     * Now see why the error/warning occurred

     */

    while (ret == SQL_SUCCESS ||

           ret == SQL_SUCCESS_WITH_INFO) {

      ret = SQLError(henv, hdbc, hstmt,

                     sqlState, &nativeErr,

                     errMsg, MSG_LNG,

                     &errMsgLen);

      switch (ret) {

        case SQL_SUCCESS:

           fprintf(stderr, "*** %s\n"

                  "*** ODBC Error/Warning = %s, "

                  "TimesTen Error/Warning "

                  " = %d\n",

                  errMsg, sqlState,

                  nativeErr);

          break;

        case SQL_SUCCESS_WITH_INFO:

          fprintf(stderr, "*** Call to SQLError"

                  " failed with return code of "

                  "SQL_SUCCESS_WITH_INFO.\n "

                  "*** Need to increase size of"

                  " message buffer.\n");

          break;

        case SQL_INVALID_HANDLE:

          fprintf(stderr, "*** Call to SQLError"

                  " failed with return code of "

                  "SQL_INVALID_HANDLE.\n");

          break;

        case SQL_ERROR:

          fprintf(stderr, "*** Call to SQLError"

                  " failed with return code of "

                  "SQL_ERROR.\n");

          break;

        case SQL_NO_DATA_FOUND:

          break;

      } /* switch */

    } /* while */

    if (rc != SQL_SUCCESS_WITH_INFO && err_is_fatal) {

      fprintf(stderr, "Exiting.\n");

      exit(-1);

    }

  }

}